home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / net / getservent.c < prev    next >
C/C++ Source or Header  |  1988-07-20  |  2KB  |  118 lines

  1. /*
  2.  * Copyright (c) 1983 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that this notice is preserved and that due credit is given
  7.  * to the University of California at Berkeley. The name of the University
  8.  * may not be used to endorse or promote products derived from this
  9.  * software without specific prior written permission. This software
  10.  * is provided ``as is'' without express or implied warranty.
  11.  */
  12.  
  13. #if defined(LIBC_SCCS) && !defined(lint)
  14. static char sccsid[] = "@(#)getservent.c    5.5 (Berkeley) 3/7/88";
  15. #endif /* LIBC_SCCS and not lint */
  16.  
  17. #include <stdio.h>
  18. #include <sys/param.h>
  19. #include <sys/types.h>
  20. #include <sys/socket.h>
  21. #include <netdb.h>
  22. #include <ctype.h>
  23. #include <netinet/in.h>
  24.  
  25. #define    MAXALIASES    35
  26.  
  27. static char SERVDB[] = "/etc/services";
  28. static FILE *servf = NULL;
  29. static char line[BUFSIZ+1];
  30. static struct servent serv;
  31. static char *serv_aliases[MAXALIASES];
  32. static char *any();
  33. int _serv_stayopen;
  34.  
  35. setservent(f)
  36.     int f;
  37. {
  38.     if (servf == NULL)
  39.         servf = fopen(SERVDB, "r" );
  40.     else
  41.         rewind(servf);
  42.     _serv_stayopen |= f;
  43. }
  44.  
  45. endservent()
  46. {
  47.     if (servf) {
  48.         fclose(servf);
  49.         servf = NULL;
  50.     }
  51.     _serv_stayopen = 0;
  52. }
  53.  
  54. struct servent *
  55. getservent()
  56. {
  57.     char *p;
  58.     register char *cp, **q;
  59.  
  60.     if (servf == NULL && (servf = fopen(SERVDB, "r" )) == NULL)
  61.         return (NULL);
  62. again:
  63.     if ((p = fgets(line, BUFSIZ, servf)) == NULL)
  64.         return (NULL);
  65.     if (*p == '#')
  66.         goto again;
  67.     cp = any(p, "#\n");
  68.     if (cp == NULL)
  69.         goto again;
  70.     *cp = '\0';
  71.     serv.s_name = p;
  72.     p = any(p, " \t");
  73.     if (p == NULL)
  74.         goto again;
  75.     *p++ = '\0';
  76.     while (*p == ' ' || *p == '\t')
  77.         p++;
  78.     cp = any(p, ",/");
  79.     if (cp == NULL)
  80.         goto again;
  81.     *cp++ = '\0';
  82.     serv.s_port = htons((u_short)atoi(p));
  83.     serv.s_proto = cp;
  84.     q = serv.s_aliases = serv_aliases;
  85.     cp = any(cp, " \t");
  86.     if (cp != NULL)
  87.         *cp++ = '\0';
  88.     while (cp && *cp) {
  89.         if (*cp == ' ' || *cp == '\t') {
  90.             cp++;
  91.             continue;
  92.         }
  93.         if (q < &serv_aliases[MAXALIASES - 1])
  94.             *q++ = cp;
  95.         cp = any(cp, " \t");
  96.         if (cp != NULL)
  97.             *cp++ = '\0';
  98.     }
  99.     *q = NULL;
  100.     return (&serv);
  101. }
  102.  
  103. static char *
  104. any(cp, match)
  105.     register char *cp;
  106.     char *match;
  107. {
  108.     register char *mp, c;
  109.  
  110.     while (c = *cp) {
  111.         for (mp = match; *mp; mp++)
  112.             if (*mp == c)
  113.                 return (cp);
  114.         cp++;
  115.     }
  116.     return ((char *)0);
  117. }
  118.